Recover from name uniqueness violation by renaming. Fixes bug #277.
authoremellor@ewan <emellor@ewan>
Wed, 5 Oct 2005 13:38:19 +0000 (14:38 +0100)
committeremellor@ewan <emellor@ewan>
Wed, 5 Oct 2005 13:38:19 +0000 (14:38 +0100)
Signed-off-by: Ewan Mellor <ewan@xensource.com>
tools/python/xen/xend/XendDomain.py
tools/python/xen/xend/XendDomainInfo.py

index 5ee74977a5c60cf50ba772720a1d7c45862c59f8..b109ef69f2b45076102d70c4c6d9686eb8b77cbb 100644 (file)
@@ -309,10 +309,12 @@ class XendDomain:
             if n == 1:
                 return matching[0]
             elif n > 1:
-                raise XendError(
-                    'Name uniqueness has been violated for name %s' % name)
-            else:
-                return None
+                log.error('Name uniqueness has been violated for name %s!  '
+                          'Recovering by renaming:', name)
+                for d in matching:
+                    d.renameUniquely()
+
+            return None
         finally:
             self.domains_lock.release()
 
index 782a1b7d68527e4f14bbaef6844f0980f56b3e81..21d72f48ff76c744a406c85860b3b971ea2fe504 100644 (file)
@@ -1288,7 +1288,7 @@ class XendDomainInfo:
         preserving the restart semantics (name and UUID preserved).
         """
         
-        new_name = self.generateShutdownName()
+        new_name = self.generateUniqueName()
         new_uuid = getUuid()
         log.info("Renaming dead domain %s (%d, %s) to %s (%s).",
                  self.info['name'], self.domid, self.uuid, new_name, new_uuid)
@@ -1307,7 +1307,23 @@ class XendDomainInfo:
         self.state_set(STATE_VM_TERMINATED)
 
 
-    def generateShutdownName(self):
+    ## public:
+
+    def renameUniquely(self):
+        """Rename this domain so that it has a unique name.  This is used by
+        XendDomain to recover from non-uniqueness errors; we should never have
+        allowed the system to reach this state in the first place."""
+        new_name = self.generateUniqueName()
+        
+        log.error('Renaming %s (%d, %s) to %s', self.info['name'], self.domid,
+                  self.uuid, new_name)
+
+        self.setName(new_name)
+
+
+    # private:
+
+    def generateUniqueName(self):
         n = 1
         while True:
             name = "%s-%d" % (self.info['name'], n)